Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit bdc6c007835db546946e4fdc9f829f8e648d5618


Parents : 5e5351d
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-22T16:11:47-05:00

feat(flatpak/snap): update runtime and base versions to 25.08, add CI workflows for building Linux packages

Changes
Diff

diff --git a/.github/workflows/build-linux-packages.yml b/.github/workflows/build-linux-packages.yml
new file mode 100644
index 00000000..edca6a0a
--- /dev/null
+++ b/.github/workflows/build-linux-packages.yml
@@ -0,0 +1,214 @@
+# Linux packaging build test: Flatpak + Snap.
+#
+# Pinned first-party actions (bump tag and SHA together when upgrading):
+# actions/checkout@v6.0.1 8e8c483db84b4bee98b60c0593521ed34d9990e8
+# actions/setup-python@v6.2.0 a309ff8b426b58ec0e2a45f0f869d46889d02405
+# actions/setup-node@v6.1.0 395ad3262231945c25e8478fd5baf05154b1d79f
+# actions/upload-artifact@v5.0.0 330a01c490aca151604b8cf639adc76d48f6c5d4
+# actions/download-artifact@v5.0.0 634f93cb2916e3fdff6788551b99b062d0335ce0
+
+name: Build Linux packages
+
+on:
+ push:
+ branches:
+ - dev
+ tags:
+ - "*"
+ pull_request:
+ branches:
+ - dev
+ paths:
+ - "package.json"
+ - "forge.config.js"
+ - "scripts/ci/github-build-linux-*.sh"
+ - ".github/workflows/build-linux-packages.yml"
+ - ".github/workflows/frontend-build.yml"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
+ NODE_OPTIONS: --max-old-space-size=8192
+ PYTHON_VERSION: "3.14"
+ NODE_VERSION: "24"
+ POETRY_VERSION: "2.3.4"
+ PNPM_VERSION: "10.32.1"
+
+jobs:
+ frontend:
+ name: Build frontend artifact
+ uses: ./.github/workflows/frontend-build.yml
+ permissions:
+ contents: read
+ with:
+ artifact_name: meshchatx-frontend-linux-pkg-${{ github.run_id }}-${{ github.run_attempt }}
+ retention_days: 1
+
+ flatpak:
+ name: Flatpak (electron-forge)
+ needs: frontend
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+ permissions:
+ contents: read
+ env:
+ FRONTEND_ARTIFACT_NAME: ${{ needs.frontend.outputs.artifact_name }}
+ MESHCHATX_FRONTEND_PREBUILT: "1"
+ steps:
+ - name: Checkout
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
+
+ - name: Install flatpak toolchain
+ run: |
+ set -euo pipefail
+ sudo apt-get update -y
+ sudo apt-get install -y --no-install-recommends \
+ flatpak \
+ flatpak-builder \
+ elfutils \
+ zstd \
+ desktop-file-utils \
+ appstream
+
+ - name: Install flatpak runtimes (user scope)
+ run: |
+ set -euo pipefail
+ flatpak --user remote-add --if-not-exists flathub \
+ https://flathub.org/repo/flathub.flatpakrepo
+ flatpak --user install -y --noninteractive flathub \
+ org.freedesktop.Platform//25.08 \
+ org.freedesktop.Sdk//25.08 \
+ org.electronjs.Electron2.BaseApp//25.08
+
+ - name: Set up Python
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+
+ - name: Install Poetry (PyPI pin)
+ env:
+ POETRY_VERSION: ${{ env.POETRY_VERSION }}
+ run: bash scripts/ci/github-install-poetry.sh
+
+ - name: Set up Node
+ uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Enable pnpm (corepack)
+ run: corepack enable && corepack prepare "pnpm@${PNPM_VERSION}" --activate
+
+ - name: Install dependencies
+ run: bash scripts/ci/github-install-deps.sh
+
+ - name: Download frontend artifact
+ uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0
+ with:
+ name: ${{ env.FRONTEND_ARTIFACT_NAME }}
+ path: meshchatx/public
+
+ - name: Verify frontend artifact contents
+ run: |
+ set -euo pipefail
+ test -f meshchatx/public/index.html
+ test -d meshchatx/public/assets
+ test -d meshchatx/public/reticulum-docs-bundled/current
+
+ - name: Build flatpak bundle
+ run: bash scripts/ci/github-build-linux-flatpak.sh
+
+ - name: List flatpak output
+ run: |
+ set -euo pipefail
+ ls -la out/make 2>/dev/null || true
+ find out/make -maxdepth 5 -type f \( -name "*.flatpak" -o -name "*.flatpakref" \) -print || true
+
+ - name: Upload flatpak artifact
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
+ with:
+ name: meshchatx-linux-flatpak-${{ github.ref_name }}-${{ github.run_id }}
+ path: |
+ out/make/**/*.flatpak
+ if-no-files-found: warn
+ retention-days: 7
+
+ snap:
+ name: Snap (electron-forge)
+ needs: frontend
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+ permissions:
+ contents: read
+ env:
+ FRONTEND_ARTIFACT_NAME: ${{ needs.frontend.outputs.artifact_name }}
+ MESHCHATX_FRONTEND_PREBUILT: "1"
+ SNAPCRAFT_BUILD_ENVIRONMENT: host
+ SNAPCRAFT_BUILD_INFO: "1"
+ steps:
+ - name: Checkout
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
+
+ - name: Install snapcraft
+ run: |
+ set -euo pipefail
+ sudo snap install snapcraft --classic
+ snapcraft --version
+
+ - name: Set up Python
+ uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
+ with:
+ python-version: ${{ env.PYTHON_VERSION }}
+
+ - name: Install Poetry (PyPI pin)
+ env:
+ POETRY_VERSION: ${{ env.POETRY_VERSION }}
+ run: bash scripts/ci/github-install-poetry.sh
+
+ - name: Set up Node
+ uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Enable pnpm (corepack)
+ run: corepack enable && corepack prepare "pnpm@${PNPM_VERSION}" --activate
+
+ - name: Install dependencies
+ run: bash scripts/ci/github-install-deps.sh
+
+ - name: Download frontend artifact
+ uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0
+ with:
+ name: ${{ env.FRONTEND_ARTIFACT_NAME }}
+ path: meshchatx/public
+
+ - name: Verify frontend artifact contents
+ run: |
+ set -euo pipefail
+ test -f meshchatx/public/index.html
+ test -d meshchatx/public/assets
+ test -d meshchatx/public/reticulum-docs-bundled/current
+
+ - name: Build snap package
+ run: bash scripts/ci/github-build-linux-snap.sh
+
+ - name: List snap output
+ run: |
+ set -euo pipefail
+ ls -la out/make 2>/dev/null || true
+ find out/make -maxdepth 5 -type f -name "*.snap" -print || true
+
+ - name: Upload snap artifact
+ uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
+ with:
+ name: meshchatx-linux-snap-${{ github.ref_name }}-${{ github.run_id }}
+ path: |
+ out/make/**/*.snap
+ if-no-files-found: warn
+ retention-days: 7

diff --git a/forge.config.js b/forge.config.js
index f4ff6a65..35988dee 100644
--- a/forge.config.js
+++ b/forge.config.js
@@ -85,10 +85,10 @@ module.exports = {
options: {
categories: ["Network"],
runtime: "org.freedesktop.Platform",
- runtimeVersion: "24.08",
+ runtimeVersion: "25.08",
sdk: "org.freedesktop.Sdk",
base: "org.electronjs.Electron2.BaseApp",
- baseVersion: "24.08",
+ baseVersion: "25.08",
finishArgs: [
"--share=ipc",
"--share=network",

diff --git a/package.json b/package.json
index 0b058c41..58857431 100644
--- a/package.json
+++ b/package.json
@@ -242,10 +242,10 @@
},
"flatpak": {
"runtime": "org.freedesktop.Platform",
- "runtimeVersion": "24.08",
+ "runtimeVersion": "25.08",
"sdk": "org.freedesktop.Sdk",
"base": "org.electronjs.Electron2.BaseApp",
- "baseVersion": "24.08",
+ "baseVersion": "25.08",
"finishArgs": [
"--share=ipc",
"--share=network",

diff --git a/scripts/ci/github-build-linux-flatpak.sh b/scripts/ci/github-build-linux-flatpak.sh
new file mode 100755
index 00000000..855dc33e
--- /dev/null
+++ b/scripts/ci/github-build-linux-flatpak.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+# Build a Flatpak via electron-forge's @electron-forge/maker-flatpak.
+#
+# Expects ``meshchatx/public/`` to already contain a prebuilt frontend bundle
+# (downloaded from the reusable Frontend build workflow), so this script only
+# rebuilds the cx_Freeze backend before running ``electron-forge make``.
+#
+# Required system packages (installed by the workflow):
+# - flatpak, flatpak-builder, elfutils (for eu-strip)
+# - org.freedesktop.Platform/Sdk//25.08
+# - org.electronjs.Electron2.BaseApp//25.08
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
+cd "$ROOT"
+
+if [[ ! -f "meshchatx/public/index.html" ]]; then
+ echo "meshchatx/public/index.html is missing; download the prebuilt frontend artifact first." >&2
+ exit 1
+fi
+
+export PLATFORM=linux
+
+pnpm run electron-postinstall
+pnpm run version:sync
+pnpm run build-backend
+
+DEBUG="${DEBUG:-@malept/flatpak-bundler*,electron-installer-flatpak*}" \
+FORGE_MAKE_FLATPAK=1 \
+ node scripts/electron-forge-local-tmp.js make --targets @electron-forge/maker-flatpak

diff --git a/scripts/ci/github-build-linux-snap.sh b/scripts/ci/github-build-linux-snap.sh
new file mode 100755
index 00000000..331b266b
--- /dev/null
+++ b/scripts/ci/github-build-linux-snap.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+# Build a Snap via electron-forge's @electron-forge/maker-snap.
+#
+# Expects ``meshchatx/public/`` to already contain a prebuilt frontend bundle
+# (downloaded from the reusable Frontend build workflow), so this script only
+# rebuilds the cx_Freeze backend before running ``electron-forge make``.
+#
+# Required system packages (installed by the workflow):
+# - snapcraft (installed via ``snap install snapcraft --classic``)
+# - LXD or multipass when building outside ``--use-lxd``/``--destructive-mode``
+# (electron-forge invokes snapcraft itself; we set
+# ``SNAPCRAFT_BUILD_ENVIRONMENT=host`` so the snap is built directly on the
+# runner without needing a build VM).
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
+cd "$ROOT"
+
+if [[ ! -f "meshchatx/public/index.html" ]]; then
+ echo "meshchatx/public/index.html is missing; download the prebuilt frontend artifact first." >&2
+ exit 1
+fi
+
+export PLATFORM=linux
+
+pnpm run electron-postinstall
+pnpm run version:sync
+pnpm run build-backend
+
+SNAPCRAFT_BUILD_ENVIRONMENT="${SNAPCRAFT_BUILD_ENVIRONMENT:-host}" \
+FORGE_MAKE_SNAP=1 \
+ node scripts/electron-forge-local-tmp.js make --targets @electron-forge/maker-snap


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────